/**
 * 认证工具类
 * 统一管理用户认证状态、token验证、刷新等功能
 */

const { TOKEN_STORAGE_KEY, BASE_URL } = require('../config');

class AuthManager {
  /**
   * 检查用户是否已认证
   * @returns {boolean} 是否已认证
   */
  checkAuth() {
    const token = wx.getStorageSync(TOKEN_STORAGE_KEY);
    if (!token) {
      return false;
    }
    
    // 可以在这里添加token有效性检查（如JWT过期时间检查）
    // 目前仅检查token是否存在
    return true;
  }

  /**
   * 要求认证，如果未认证则跳转到登录页
   * @param {string} redirectUrl - 登录成功后跳转的页面路径（可选）
   * @returns {boolean} 是否已认证
   */
  requireAuth(redirectUrl = '') {
    if (this.checkAuth()) {
      return true;
    }

    // 保存当前页面路径，用于登录后返回
    if (redirectUrl) {
      wx.setStorageSync('auth_redirect_url', redirectUrl);
    } else {
      const pages = getCurrentPages();
      if (pages.length > 0) {
        const currentPage = pages[pages.length - 1];
        wx.setStorageSync('auth_redirect_url', `/${currentPage.route}`);
      }
    }

    // 跳转到登录页
    wx.reLaunch({
      url: '/pages/login/login'
    });

    return false;
  }

  /**
   * 刷新token
   * @returns {Promise<boolean>} 是否刷新成功
   */
  async refreshToken() {
    try {
      const token = wx.getStorageSync(TOKEN_STORAGE_KEY);
      if (!token) {
        return false;
      }

      // 直接使用 wx.request 避免循环依赖
      return new Promise((resolve) => {
        wx.request({
          url: `${BASE_URL}/api/miniapp/user/refresh`,
          method: 'POST',
          header: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${token}`
          },
          success: (res) => {
            const { statusCode, data: body = {} } = res;
            if (statusCode === 200 && body.code === 200 && body.data && body.data.token) {
              wx.setStorageSync(TOKEN_STORAGE_KEY, body.data.token);
              if (body.data.user) {
                wx.setStorageSync('profile.snapshot', body.data.user);
              }
              resolve(true);
            } else {
              resolve(false);
            }
          },
          fail: () => {
            resolve(false);
          }
        });
      });
    } catch (error) {
      console.error('Token刷新失败:', error);
      return false;
    }
  }

  /**
   * 获取当前用户信息
   * @returns {Object|null} 用户信息对象或null
   */
  getUserInfo() {
    try {
      const userInfo = wx.getStorageSync('profile.snapshot');
      return userInfo || null;
    } catch (error) {
      console.error('获取用户信息失败:', error);
      return null;
    }
  }

  /**
   * 获取当前token
   * @returns {string|null} token或null
   */
  getToken() {
    try {
      return wx.getStorageSync(TOKEN_STORAGE_KEY) || null;
    } catch (error) {
      console.error('获取token失败:', error);
      return null;
    }
  }

  /**
   * 清除认证信息
   */
  clearAuth() {
    wx.removeStorageSync(TOKEN_STORAGE_KEY);
    wx.removeStorageSync('profile.snapshot');
    wx.removeStorageSync('auth_redirect_url');
    const app = getApp();
    if (app && typeof app.setAuthState === 'function') {
      app.setAuthState(false, null);
    }
  }

  /**
   * 登录成功后处理
   * @param {string} token - 新的token
   * @param {Object} userInfo - 用户信息（可选）
   */
  setAuth(token, userInfo = null) {
    wx.setStorageSync(TOKEN_STORAGE_KEY, token);
    if (userInfo) {
      wx.setStorageSync('profile.snapshot', userInfo);
    }
    const app = getApp();
    if (app && typeof app.setAuthState === 'function') {
      app.setAuthState(true, userInfo || null);
    }

    // 检查是否有重定向URL
    const redirectUrl = wx.getStorageSync('auth_redirect_url');
    if (redirectUrl) {
      wx.removeStorageSync('auth_redirect_url');
      // 延迟跳转，确保token已保存
      setTimeout(() => {
        wx.reLaunch({
          url: redirectUrl
        });
      }, 100);
    }
  }

  /**
   * 检查token是否即将过期（提前5分钟刷新）
   * @returns {Promise<boolean>} 是否需要刷新
   */
  async checkTokenExpiry() {
    // 如果后端支持JWT，可以在这里解析token并检查过期时间
    // 目前简化处理，仅检查token是否存在
    return this.checkAuth();
  }
}

// 导出单例
const authManager = new AuthManager();
module.exports = authManager;

